home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / tool_inc.zip / ATTACH.INC < prev    next >
Text File  |  1989-03-01  |  3KB  |  111 lines

  1.  
  2. (*
  3.  * Copyright 1987, 1989 Samuel H. Smith;  All rights reserved
  4.  *
  5.  * This is a component of the ProDoor System.
  6.  * Do not distribute modified versions without my permission.
  7.  * Do not remove or alter this notice or any other copyright notice.
  8.  * If you use this in your own program you must distribute source code.
  9.  * Do not use any of this in a commercial product.
  10.  *
  11.  *)
  12.  
  13. (*
  14.  * attach.inc - support to attach and de-attach interrupt traps
  15.  *
  16.  * Usage:
  17.  *    {$i attach.inc}
  18.  *
  19.  *    const
  20.  *       old_21: longlink(ofs:0;seg:0);
  21.  *
  22.  *    procedure new_21(...);
  23.  *       interrupt;
  24.  *    begin
  25.  *       ENTER_INTERRUPT;
  26.  *       {do normal stuff}
  27.  *       LINK_CALL(old_21);   {call old handler if needed}
  28.  *       {do more normal stuff, beware segment changes}
  29.  *       LINK_JMP(old_21);    {exit this handler and jump to old one}
  30.  *       EXIT_INTERRUPT;      {exit this handler, ignore old one}
  31.  *   end;
  32.  *
  33.  *   initialize:
  34.  *      attach_handler($21,ofs(new_21),old_21);
  35.  *      ... handler is active
  36.  *      remove_handler($21,old_21);
  37.  *
  38.  *)
  39.  
  40. (*$R-,S-  range check and stack check off, this file only *)
  41.  
  42.  
  43. (* ------------------------------------------------------------ *)
  44. procedure get_handler(vector:      integer;     {vector number}
  45.                       var link:    longlink);   {cseg link to old handler}
  46.  
  47.    (* get a pointer to the current handler for an interrupt vector *)
  48. var
  49.    reg:  registers;
  50. begin
  51.  
  52. (* save the old interrupt handler's vector *)
  53.    reg.ax := $3500+vector;
  54.    msdos(reg);
  55.    link.seg := reg.es;
  56.    link.ofs := reg.bx;
  57. end;
  58.  
  59.  
  60. (* ------------------------------------------------------------ *)
  61. procedure attach_handler(vector:      integer;     {vector number}
  62.                          handler:     integer;     {cseg ofs of new handler}
  63.                          var link:    longlink);   {cseg link to old handler}
  64.  
  65.    (* attach an interrupt handler to the specified vector number;
  66.       handler is the cseg offset of the new handler; link will
  67.       contain a long pointer to the previous handler *)
  68. var
  69.    reg:  registers;
  70. begin
  71.  
  72. writeln('attach handler: stubbed; vector=',vector,' handler=',handler);
  73. halt(99);
  74.  
  75. (* save the old interrupt handler's vector *)
  76.    get_handler(vector,link);
  77.  
  78. (* install a vector to the new handler *)
  79.    reg.ax := $2500+vector;
  80.    reg.dx := handler;
  81.    reg.ds := cseg;
  82.    msdos(reg);
  83. end;
  84.  
  85.  
  86. (* ------------------------------------------------------------ *)
  87. procedure remove_handler(vector:      integer;     {vector number}
  88.                          var link:    longlink);   {cseg link to old handler}
  89.  
  90.    (* remove an interrupt handler and replace the old handler *)
  91. var
  92.    reg:  registers;
  93. begin
  94.  
  95. (* can't install old vector more than once *)
  96.    if (link.ofs = 0) and (link.seg = 0) then
  97.       exit;
  98.  
  99. (* install the old vector *)
  100.    reg.ax := $2500+vector;
  101.    reg.dx := link.ofs;
  102.    reg.ds := link.seg;
  103.    msdos(reg);
  104.  
  105. (* flag old vector as invalid *)
  106.    link.ofs := 0;
  107.    link.seg := 0;
  108. end;
  109.  
  110.  
  111.